Інформація про новину
  • Переглядів: 1374
  • Дата: 13-02-2022, 12:04
13-02-2022, 12:04

17. Операції з рядками в Python. Шифр Цезаря

Категорія: Інформатика





Попередня сторінка:  16. Елемент керування ListBox в Python
Наступна сторінка:   18. Впорядкування елементів списку на Py...

Як розшифрувати повідомлення, зашифроване шифром Цезаря, не знаючи ключа?

На минулих уроках ми виконували різноманітні дії зі списками, що містять числа. Сьогодні ти будеш працювати з текстовими даними. Перетворившись на справжнього секретного агента, ти створиш програму для шифрування та розшифрування текстових повідомлень.

Зараз одним із найпростіших вважається шифр Цезаря, однак за часів Давнього Риму цей шифр не міг розшифрувати ніхто. Цим шифром користувався Юлій Цезар для приватного листування. Зашифрувати повідомлення — це все одно, як замкнути його в скрині: прочитати його зможе лише той, хто має ключ.

ВІТключем називають невеликий обсяг інформації, за допомогою якого шифрують та/або розшифровують повідомлення.

Завдання № 1

Принцип шифрування за допомогою шифру Цезаря: кожну літеру тексту замінити на ту, яка в алфавіті (або в кодовій таблиці символів) йде від неї на k літер далі. k — це ключ. Перехопивши повідомлення типу «тук шзфе хцфяесвуее», малограмотні вороги навіть не намагалися його прочитати, оскільки думали, що це повідомлення на невідомій мові.

1) Зашифруй шифром Цезаря слово шифрування. Ключ шифру: 2.

За часів Юлія Цезаря не існувало кодових таблиць символів, тому для шифрування/дешифрування повідомлень можна було послугуватися лише латинським алфавітом. Але якщо до номерів останніх літер алфавіту додати ключ, то отримаємо числа, які перевищують кількість символів у алфавіті. Тому застосовувався принцип циклічності: вважалося, що літери алфавіту записані по колу й після Z знову йде A.

2) Зашифруй слово цезар, якщо ключ — 1.

Завдання № 2

Розшифруй слово ргцнг, якщо ключ — 3.

Ознайомся в рубриці «Запитання-відповіді» з принципом зберігання текстових даних і визнач, що виведе така програма:

Завдання № 4

дізнайся з рубрики «Запитання-відповіді», для чого призначено функцію chr() і спробуй визначити, що виведе такий код, не запускаючи його:

Завдання № 5

дізнайся з рубрики «Запитання-відповіді», для чого призначено функцію ord(), і спробуй визначити, що виведе такий код, не запускаючи його:

Завдання № 6

дізнайся з рубрики «Запитання-відповіді» про перебір символів рядка. доповни код програми, у якій користувач вводить з клавіатури ключ і рядок s, а програма його шифрує і виводить закодований рядок sz.

Завдання № 7

Реалізуй задачу з завдання №6 у програмному середовищі. Перевір результат на прикладі:

На основі попередньої програму створи ще одну, яка виконуватиме протилежні дії: вона має розшифровувати закодований текст, що, як і ключ, вводиться з клавіатури.

Перевір результат на прикладі:

Завдання № 9

Створи відповідно до зразка графічний інтерфейс для програми шифру-вання/розшифрування. Надай елементам керування імена, що вказані у виносках.

Завдання № 10

доповни код, у якому текстовий рядок і ключ вводяться не з клавіатури, а зчитуються з текстових полів Ent_key (у ньому введено ключ key) та Ent1 (у ньому введено рядок s).

Можеш скористатися рубрикою «Запитання-відповіді» з розділу «введення елементів списку».

Дізнайся з рубрики «Запитання-відповіді», як відобразити текстовий рядок в елементі керування «Текстове поле», та заповни пропуск у, що відображає рядок s2 у текстовому полі Ent1.

Завдання № 12

Користуючись кодом з попереднього завдання та з завдань №7 і №8, створи функції-обробники подій натискання кнопок «Шифрувати» та «Розшифрувати», які створені в інтерфейсі програми у Завданні №9. Щоб дані у текстовому полі перезаписувалися, а не дописувалися до попередніх значень, потрібно додати до обробника події команду очищення текстового поля під час кожного натискання кнопок:

Перевір результат виконання програми:

ЗАПИТАННЯ-ВІДПОВІДІ

Чи можна отримати доступ до окремого символу в рядку ?

Текстовий рядок — це список символів.

Щоб отримати один символ рядка, необхідно вказати ім'я змінної, що містить рядок, а в квадратних дужках — індекс (порядковий номер) символу.

Символи рядка нумеруються з нуля. Ось так, наприклад, у пам'яті комп'ютера буде записано рядок, який містить змінна а:

тут і — це порядковий номер символу рядка а.

Як отримати доступ до певного фрагмента (підрядка) заданого рядка?

Отримати певний фрагмент рядка, який ще називають зрізом або підрядком, можна за допомогою такого оператора:

S — змінна для зберігання підрядка; text — початковий рядок;

І — індекс символу, з якого починається підрядок;

J — індекс символу закінчення підрядка, що вже не включається до зрізу;

K — крок, з яким вибираються символи.

Стандартне значення для параметра K — 1, тобто якщо третій параметр не вказано, то символи вибираються послідовно. Якщо параметр I не задано, то зріз формується від 0-го до J-1 -го символу включно. Якщо параметр J не задано, то зріз формується від 1-го символу до кінця рядка.

Наприклад,

Як послідовно перебрати всі символи рядка?

Для перебору всіх символів рядка використовують цикл, що має такий вигляд:

Із символами, що перебираються, можна виконувати різноманітні дії. Наприклад, так виглядатиме цикл, який визначає, скільки разів у рядку х трапляється літера "а":

Увага!

У наведеному циклі для доступу до символу рядка використовується лічильник і, а не вираз s[i].

Як ви вже знаєте з попередніх тем, кожен символ має числовий код. Коди ставляться у відповідність символам за допомогою кодової таблиці.

У кириличних текстах Python-програм використовується таблиця Unicode. Ось фрагмент кодової таблиці Unicode, що містить символи українського алфавіту.

Для визначення символу Unicode за його кодом у використовують функцію chr(y), а для визначення коду символу x — функцію ord(x).

Наприклад,

Як відобразити рядок у текстовому полі?

Метод ent.insert(K,string) вставляє текст string у позицію K у текстовому полі ent.

Якщо як параметр K вказати константу END, то рядок string буде дописано до тексту, що вже є в полі, справа.

Наприклад, якщо поле ent було порожнім, то в результаті виконання коду ent.insert(END,s) у ньому відобразиться текстовий рядок s.

ПЕРЕВІР СЕБЕ

1. Вкажи значення індексів у команді формування рядка b, який у результаті одержав значення "паста”.

2. Дізнайся з рубрики «Запитання-відповіді» про оператор формування фрагмента (зрізу) рядка. Дано рядки:

Створи програму, що формує та виводить слово "реструктуризація”, використовуючи лише зрізи заданих рядків.

3. Проаналізуй наведені нижче фрагменти коду і визнач результат виконання команди print в кожному з них, не створюючи самих програм у Python.

4. Як ми вже зазначали, шифр Цезаря дуже легко «зламати», тобто розшифрувати, не знаючи ключа. Для цього достатньо перебрати всі можливі значення ключа, яких може бути не більше, ніж символів у алфавіті.

Створи програму, у якій користувач вводитиме зашифрований текст, а в циклі перебиратимуться значення ключа в діапазоні від 1 до 30 включно. Програма має виводити ці значення ключа, а також розшифроване повідомлення для кожного зі значень. Правильний ключ — той, для якого відображене повідомлення містить осмислений текст.

Попроси когось із однокласників надіслати тобі зашифрований текст у месенджері, а ключ не повідомляти. Розшифруй цей текст.

Наука про шифрування повідомлень називається криптографією, а про їхнє розшифрування без інформації про ключ — криптоаналізом. У щойно створеній програмі було виконано криптоаналіз шифру Цезаря. Як і в цій програмі, під час криптоаналізу завжди вважають, що алгоритм шифрування і зашифрований текст відомі, а ключ — ні.

5. Чому, на твою думку, за часів античності ніхто не міг зламати шифр Цезаря?

 

 

Це матеріал з підручника Інформатика 9 клас Коршунова 2022

 




Попередня сторінка:  16. Елемент керування ListBox в Python
Наступна сторінка:   18. Впорядкування елементів списку на Py...



^